#include "main.h"
#include "animation.h"
#include "control.h"
#include "indicators.h"
#include "gear.h"
#include "tires.h"
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <sys/time.h>
#include "lvgl/lvgl.h"
#include "lvgl/src/misc/lv_mem.h"
#include "control.h"
#include <unistd.h>
#include <sdl/sdl.h>
#include <demos/lv_demos.h>
#include <pthread.h>
#include "lv_drivers/display/fbdev.h"
#include "lv_drivers/indev/evdev.h"
#include "lv_conf.h"
#include <math.h>
#include "ui/ui.h"
#include <time.h>
#include <signal.h>
#include <linux/limits.h>
#include <errno.h>
#include "ui_message_handler.h"


#define DISP_BUF_SIZE (800 * 480 * 4)

// 全局变量定义
volatile bool is_console_input_active = false; // 控制台输入活动标志


// 添加全局变量用于优雅退出
static volatile sig_atomic_t keep_running = 1;

// 全局消息队列初始化
#define UI_QUEUE_CAPACITY 512

// 声明http_weather_init函数原型
void http_weather_init(void);

pthread_mutex_t g_queue_mutex = PTHREAD_MUTEX_INITIALIZER;

// 自定义时钟获取
uint32_t custom_tick_get(void)
{
    static uint64_t start_ms = 0;
    if (start_ms == 0)
    {
        struct timeval tv_start;
        gettimeofday(&tv_start, NULL);
        start_ms = (tv_start.tv_sec * 1000000 + tv_start.tv_usec) / 1000;
    }

    struct timeval tv_now;
    gettimeofday(&tv_now, NULL);
    uint64_t now_ms;
    now_ms = (tv_now.tv_sec * 1000000 + tv_now.tv_usec) / 1000;

    uint32_t time_ms = now_ms - start_ms;
    return time_ms;
}

// 输入输出初始化
void init_input_output(void)
{
    // 配置显示接口
    fbdev_init();
    // // 初始化输入接口
    evdev_init();

    // sdl_init();

    // 输出接口
    static lv_color_t buf[DISP_BUF_SIZE];  // 显示缓冲区
    static lv_color_t buf1[DISP_BUF_SIZE]; // 显示缓冲区
    static lv_disp_draw_buf_t disp_buf;
    lv_disp_draw_buf_init(&disp_buf, buf, buf1, DISP_BUF_SIZE);

    // 设置显示缓冲区属性
    static lv_disp_drv_t disp_drv;
    lv_disp_drv_init(&disp_drv);
    disp_drv.draw_buf = &disp_buf;
    disp_drv.flush_cb = fbdev_flush;  //该代码是开发板进行测试显示使用的
    // disp_drv.flush_cb = sdl_display_flush; // 该代码是pc端进行测试显示使用的
    disp_drv.hor_res = 800;
    disp_drv.ver_res = 480;
    lv_disp_drv_register(&disp_drv);
    // 样式初始化已通过pthread_once在control.c中处理

    // 输入接口
    static lv_indev_drv_t indev_drv_1;
    lv_indev_drv_init(&indev_drv_1);          /*Basic initialization*/
    indev_drv_1.type = LV_INDEV_TYPE_POINTER; // 设置输入事件类型
    indev_drv_1.read_cb = evdev_read; //该代码是开发板进行测试显示使用的
    // indev_drv_1.read_cb = sdl_mouse_read; // 该代码是pc端进行测试显示使用的
    lv_indev_t *mouse_indev = lv_indev_drv_register(&indev_drv_1);
}

// 信号处理函数
void handle_signal(int sig)
{
    keep_running = 0;
}

// 状态更新函数
void seechange(void)
{
    static uint32_t last_time = 0;
    uint32_t act_time = lv_tick_get();

    // 输入时暂停显示更新
    if (act_time - last_time > 100 && !is_console_input_active)
    {
        // 使用异步调用确保在主线程执行
        lv_async_call(update_display, NULL);
        last_time = act_time;
    }
}

// 声明Control模块初始化函数
void Control_Init(void);

int main(void)
{
    pthread_t tid;
    init_mutex(); // 初始化互斥锁

   // 初始化LVGL内存池
    lv_mem_init();

    // 初始化消息队列系统
    ui_message_system_init(UI_QUEUE_CAPACITY);

    // 设置信号处理
    signal(SIGINT, handle_signal);
    signal(SIGTERM, handle_signal);

    Control_Init(); // 初始化控制模块互斥锁
    lv_init();

    // 或改为显式初始化检查（推荐）：
    if (!lv_is_initialized())
    {
        fprintf(stderr, "LVGL初始化失败\n");
        return EXIT_FAILURE;
    }

    // 显示和输入设备初始化
    init_input_output();

    // 初始化样式（确保显示驱动已就绪）
    init_small_font_style();


    // UI初始化
    ui_init();

    // 等待UI渲染完成
    for (int i = 0; i < 5; i++)
    {
        lv_timer_handler();
        ui_message_process_all(); // 处理消息队列
        usleep(20000); // 20ms
    }

    // // 再启动控制线程
    // pthread_t tid;
    if (pthread_create(&tid, NULL, iu_main, NULL) != 0)
    {
        fprintf(stderr, "无法创建控制进程\n");
        return EXIT_FAILURE;
    }



    // 初始化速度指针
    init_speed_pointer();
    init_revspeed_pointer();
    init_fuel_pointer();
    init_coolant_pointer();

    init_gear_ui(); // 初始化档位UI

    init_tire_ui_objects(); // 初始化轮胎UI对象

    init_indicators(); // 初始化指示灯UI对象

    // Control_Init();
    http_weather_init(); // 初始化天气更新服务

    // 设置默认轮胎状态
    update_tire_status(TIRE_FRONT_LEFT, 220, 100);
    update_tire_status(TIRE_FRONT_RIGHT, 220, 100);
    update_tire_status(TIRE_REAR_LEFT, 220, 100);
    update_tire_status(TIRE_REAR_RIGHT, 220, 100);

    // 主事件循环
    while (keep_running)
    {
        uint32_t delay = lv_task_handler();
        static uint32_t last_msg_time = 0;
        uint32_t now = lv_tick_get();

        // 始终处理UI消息，不受控制台输入影响
        if (now - last_msg_time > 10) {
            ui_message_process_all();  // 处理UI消息
            last_msg_time = now;
        }
        // seechange();
        // 确保最小延迟1000ms以稳定输入显示
        uint32_t min_delay = 10; // 最小延迟10ms
        usleep((delay < min_delay ? min_delay : delay) * 1000);
    }

    // 清理
    ui_message_system_destroy();

    // 等待控制线程结束
    pthread_join(tid, NULL);

    // 添加LVGL资源清理
    lv_deinit();

    return EXIT_SUCCESS;
}